#ifndef REGISTRO_H_
#define REGISTRO_H_

using namespace std;

#include "Compuesto.h"
#include <iostream>
#include <string>

//Unidad de almacenamiento unitario.
class Registro: public Componente{
	public:
		Registro();
		//Registro(Componente componente);
		virtual void addCampo(int valor, bool clave);
		virtual void addCampo(char valor, bool clave);
		virtual void addCampo(double valor, bool clave);
		void* getCampo();
		int getCantidadCampo();
		int getRetSize();
		virtual int getTamanio();

		list<bool>& getClaves()const;
		list<void*>& getValores()const;
		list<string>& getTipos()const;
		list<string> getValoresClaves()const;
		list<int>& getCantidades();

		int esBuscado(list<string> claves);
		friend ostream& operator <<(ostream &salida, const Registro& valor) {

			list<void*>::const_iterator it = valor.getValores().begin();
			list<string>::const_iterator it2 = valor.getTipos().begin();

			while (it != valor.getValores().end()){
				if (*it2 == "char"){
					salida << "\t\tValor: "<<*((char*)(*it))<<" Tipo: "<<"char"<<endl;
				}
				else if (*it2 == "int"){
					salida << "\t\tValor: "<<*((int*)(*it))<<" Tipo: "<<"int"<<endl;
				}
				else if (*it2 == "double"){
					salida << "\t\tValor: "<<*((double*)(*it))<<" Tipo: "<<"double"<<endl;
				}
				it++;
				it2++;
			}
			return salida;
	    }
	protected:
		list<string> tipos;
		list<bool> claves;
		list<void*> valores;
		list<int> cantidad;
		int campoActual;
		int retSize;
};

#endif /*REGISTRO_H_*/
